package DAO;

import javafx.geometry.Bounds;

import java.util.ArrayList;
import java.util.List;

/**
 * 在list能够取得的信息
 */
public class NodeList {

    public static List<TreeNode> list = new ArrayList<>();
    private static double height = 0; // 节点的高度


    // 实现获取根节点的方法 getRoot()，遍历节点列表，找到父节点为 0 的节点作为根节点：
    public static TreeNode getRoot() {
        TreeNode r = new TreeNode();
        for (int i = 0; i < NodeList.list.size(); i++) {

            if (NodeList.list.get(i).getPid() == 0) {
                r = NodeList.list.get(i);
                break;
            }
        }

        return r;
    }

    // 实现获取节点的父节点的方法 getParent(TreeNode node)，遍历节点列表，找到指定节点的父节点：
    public static TreeNode getParent(TreeNode node) {
        TreeNode p = new TreeNode();
        for (int i = 0; i < NodeList.list.size(); i++) {
            if (NodeList.list.get(i).getNid() == node.getPid()) { // 如果存在一个节点的id等于该节点的父节点id,返回
                p = NodeList.list.get(i);
                return p;
            }
        }
        return p; // 不存在，返回空的节点
    }

    // 实现获取前一个兄弟节点的方法 getPreChild(TreeNode node)，找到指定节点的父节点，然后找到指定节点的同一方向的前一个兄弟节点
    public static TreeNode getPreChild(TreeNode node) {
        TreeNode p = NodeList.getParent(node); // p节点为父节点
//        System.out.println(NodeList.getParent(node));
        TreeNode pre = p.getNodeChildren().get(0); // 取到该节点的第一个兄弟节点
        for (int i = 1; i < p.getNodeChildren().size(); i++) { // 遍历p的所有子节点
            if (node.getNid() == p.getNodeChildren().get(i).getNid()) { // 当遍历到自己的时候，停止，节省资源
                break;
            }
            if (node.getPos() == p.getNodeChildren().get(i).getPos()) { // 判断是否同一方向
                pre = p.getNodeChildren().get(i);
            }

        }
        return pre;
    }

    // 判断节点是否为父节点的第一个子节点的方法 isFirstChild(TreeNode node)，找到指定节点的父节点，然后判断该节点是否为父节点的左子节点或右子节点：
    public static boolean isFirstChild(TreeNode node) {
        TreeNode p = NodeList.getParent(node); // p节点为父节点
        TreeNode l = new TreeNode();
        TreeNode r = new TreeNode();
        for (int i = 0; i < p.getNodeChildren().size(); i++) {
            if (p.getNodeChildren().get(i).getPos() == 0) { // 如果出现第一个pos=0,则l是左边第一个节点
                l = p.getNodeChildren().get(i);
                break;
            }
        }
        for (int i = 0; i < p.getNodeChildren().size(); i++) {
            if (p.getNodeChildren().get(i).getPos() == 1) {  // 如果出现第一个pos=1,则r是右边第一个节点
                r = p.getNodeChildren().get(i);
                break;
            }
        }
        if (node.getNid() == l.getNid() || node.getNid() == r.getNid()) {
            return true;
        }

        return false;
    }

    // 获取子节点高度的方法 getChildHeight(TreeNode p , int pos)，计算子节点的高度：
    public static double getChildHeight(TreeNode p, int pos) {
        height = 0;
        if (p.getPid() == 0) { // 如果p是根节点
            List<TreeNode> list = new ArrayList<>();
            for (int i = 0; i < p.getNodeChildren().size(); i++) {
                if (p.getNodeChildren().get(i).getPos() == pos) { // 让所有的右节点进入list
                    list.add(p.getNodeChildren().get(i));
                }
            }
            for (int i = 0; i < list.size(); i++) {
                walkNode(list.get(i));
                if (i < list.size() - 1)
                    height += 20;
            }
        } else {
            walkNode(p);
        }
        return height;
    }

    // 递归遍历节点的方法 walkNode(TreeNode p)，计算子节点的高度：
    private static void walkNode(TreeNode p) {
        for (int i = 0; i < p.getNodeChildren().size(); i++) { // 观察该节点是否还有子节点以提高高度
            TreeNode node = new TreeNode();
            node = p.getNodeChildren().get(i);
            if (!node.getNodeChildren().isEmpty()) {
                walkNode(node);  // 子节点不为空，进入子节点继续递归
            } else {
                height += node.getHeight(); // 如node为最后一个节点，height+node.height
            }
            if (i < p.getNodeChildren().size() - 1)
                height += 20; // 如果node不是同一层次的最后一个节点，再提高20，保证p居中
        }
        if (p.getNodeChildren().isEmpty()) { // 如果该节点p一个字节点都没有，height直接+p.height
            height += p.getHeight();
        }
    }
}


